package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;

import com.zenithmind.chat.pojo.dto.ChatPrivateMessageDTO;
import com.zenithmind.chat.pojo.entity.ChatPrivateMessage;
import com.zenithmind.chat.pojo.vo.ChatPrivateMessageVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 私聊消息服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatPrivateMessageService extends IService<ChatPrivateMessage> {

    /**
     * 分页查询私聊消息列表
     * 
     * @param sessionId 会话ID
     * @param userId 当前用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    PageResult<ChatPrivateMessageVO> getMessagePage(String sessionId, String userId, 
                                                   Integer pageNum, Integer pageSize);

    /**
     * 获取会话消息列表
     * 
     * @param sessionId 会话ID
     * @param userId 当前用户ID
     * @param lastMessageId 最后消息ID（用于分页）
     * @param limit 限制数量
     * @return 消息列表
     */
    List<ChatPrivateMessageVO> getSessionMessages(String sessionId, String userId, 
                                                 String lastMessageId, Integer limit);

    /**
     * 根据ID获取消息详情
     * 
     * @param id 消息ID
     * @param userId 当前用户ID
     * @return 消息详情
     */
    ChatPrivateMessageVO getMessageById(String id, String userId);

    /**
     * 发送私聊消息
     * 
     * @param messageDTO 消息DTO
     * @param userId 发送者ID
     * @return 消息ID
     */
    String sendPrivateMessage(ChatPrivateMessageDTO messageDTO, String userId);

    /**
     * 撤回消息
     *
     * @param id 消息ID
     * @param userId 操作者ID
     * @param reason 撤回原因
     * @return 是否成功
     */
    Boolean recallMessage(String id, String userId, String reason);

    /**
     * 撤回消息（简化版）
     *
     * @param id 消息ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean recallMessage(String id, String userId);

    /**
     * 删除消息
     * 
     * @param id 消息ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteMessage(String id, String userId);

    /**
     * 批量删除消息
     * 
     * @param ids 消息ID列表
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteMessagesBatch(List<String> ids, String userId);

    /**
     * 标记消息为已读
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean markMessagesAsRead(String sessionId, String userId);

    /**
     * 搜索消息
     *
     * @param sessionId 会话ID
     * @param keyword 搜索关键词
     * @param messageType 消息类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 消息列表
     */
    List<ChatPrivateMessageVO> searchMessages(String sessionId, String keyword, Integer messageType,
                                             String startTime, String endTime, Integer limit);

    /**
     * 搜索消息（分页版）
     *
     * @param sessionId 会话ID
     * @param keyword 搜索关键词
     * @param messageType 消息类型
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param userId 用户ID
     * @return 消息分页列表
     */
    PageResult<ChatPrivateMessageVO> searchMessages(String sessionId, String keyword, Integer messageType,
                                                   Integer pageNum, Integer pageSize, String userId);

    /**
     * 获取用户未读消息数量
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer getUnreadMessageCount(String sessionId, String userId);

    /**
     * 获取会话最新消息
     * 
     * @param sessionId 会话ID
     * @param userId 当前用户ID
     * @return 最新消息
     */
    ChatPrivateMessageVO getLatestMessage(String sessionId, String userId);

    /**
     * 创建或获取私聊会话
     * 
     * @param userId 用户ID
     * @param friendId 好友ID
     * @return 会话ID
     */
    String createOrGetSession(String userId, String friendId);

    /**
     * 获取用户的私聊会话列表
     * 
     * @param userId 用户ID
     * @return 会话列表
     */
    List<Object> getUserSessions(String userId);

    /**
     * 删除会话
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean deleteSession(String sessionId, String userId);

    /**
     * 清空会话消息
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean clearSessionMessages(String sessionId, String userId);

    /**
     * 获取消息统计信息
     * 
     * @param userId 用户ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 统计信息
     */
    Object getMessageStatistics(String userId, String startTime, String endTime);

    /**
     * 清理过期消息
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Integer cleanExpiredMessages(Integer days);

    /**
     * 检查发送权限
     *
     * @param userId 发送者ID
     * @param receiverId 接收者ID
     * @return 是否有权限
     */
    Boolean checkSendPermission(String userId, String receiverId);

    /**
     * 发送消息
     *
     * @param messageDTO 消息DTO
     * @param userId 发送者ID
     * @return 消息ID
     */
    String sendMessage(ChatPrivateMessageDTO messageDTO, String userId);

    /**
     * 编辑消息
     *
     * @param messageId 消息ID
     * @param newContent 新内容
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean editMessage(String messageId, String newContent, String userId);

    /**
     * 转发消息
     *
     * @param messageId 消息ID
     * @param targetIds 目标ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean forwardMessage(String messageId, List<String> targetIds, String userId);

    /**
     * 回复消息
     *
     * @param originalMessageId 原消息ID
     * @param messageDTO 消息DTO
     * @param userId 用户ID
     * @return 消息ID
     */
    String replyMessage(String originalMessageId, ChatPrivateMessageDTO messageDTO, String userId);

    /**
     * 标记为已读
     *
     * @param messageId 消息ID
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean markAsRead(String messageId, String sessionId, String userId);

    /**
     * 获取未读数
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 未读数
     */
    Integer getUnreadCount(String sessionId, String userId);

    /**
     * 批量删除消息
     *
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean batchDeleteMessages(List<String> messageIds, String userId);

    /**
     * 导出消息
     *
     * @param sessionId 会话ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param format 格式
     * @param userId 用户ID
     * @return 导出结果
     */
    String exportMessages(String sessionId, String startDate, String endDate, String format, String userId);

    /**
     * 清除聊天历史
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean clearChatHistory(String sessionId, String userId);

    /**
     * 获取最近消息
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近消息列表
     */
    List<ChatPrivateMessageVO> getRecentMessages(String userId, Integer limit);

    /**
     * 设置自动回复
     *
     * @param userId 用户ID
     * @param enabled 是否启用
     * @param content 回复内容
     * @return 是否成功
     */
    Boolean setAutoReply(String userId, Boolean enabled, String content);

    /**
     * 获取草稿
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 草稿内容
     */
    String getDraft(String sessionId, String userId);

    /**
     * 保存草稿
     *
     * @param sessionId 会话ID
     * @param content 草稿内容
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean saveDraft(String sessionId, String content, String userId);
}
